<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>正则表达式-简介 | 失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		<article>
	
		<h1>正则表达式-简介</h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/正则表达式/">正则表达式</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正则表达式（Regular Expression）是一种文本模式，包括普通字符和特殊字符。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正则表达式是繁琐的，但它是强大的，许多程序设计语言都支持利用正则表达式进行字符串操作。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;例如，使用 <code>?</code> 和 <code>*</code> 通配符来查找硬盘上的文件。<code>?</code> 通配符匹配文件名中的单个字符，而 <code>*</code> 通配符匹配零个或多个字符。像 <code>data?.dat</code> 这样的模式将查找下列文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">data1.dat</div><div class="line">data2.dat</div><div class="line">datax.dat</div><div class="line">dataN.dat</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用 <em> 字符代替 ？ 字符扩大了找到的文件数量。data</em>.dat 匹配烈夏所有文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">data.dat</div><div class="line">data1.dat</div><div class="line">data2.dat</div><div class="line">data12.dat</div><div class="line">datax.dat</div><div class="line">dataXYZ.dat</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;尽管这种搜索方法很有用，但它还是有限的。通过理解 * 通配符的工作原理，引入了正则表达式所依赖的概念，但正则表达式功能强大，而且更加灵活。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正则表达式的使用，可以通过简单的办法来实现强大的功能。下面一个简单的示例：</p>
<p><strong>\^[0-9]+abc$</strong></p>
<ul>
<li><code>^</code> 为匹配输入字符串的开始位置。</li>
<li><code>[0-9]+</code> 匹配多个数字，<code>[0-9]</code> 匹配单个数字，<code>+</code> 匹配一个或者多个。</li>
<li><code>abc$</code> 匹配字母 <code>abc</code> 并以 <code>abc</code> 结尾， <code>$</code> 为匹配输入字符串的结束位置。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;实例：匹配以数字开头，并以 abc 结尾的字符串：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">var str = <span class="string">"123abc"</span>;</div><div class="line">var parr1 = /^[0-9]+abc$/;</div><div class="line">document.write(str.match(patt1));</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以上标记的文本是获得的匹配的表达式：<code>123abc</code></p>
<h2 id="为什么使用正则表达式？"><a href="#为什么使用正则表达式？" class="headerlink" title="为什么使用正则表达式？"></a>为什么使用正则表达式？</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;典型的搜索和替换操作要求提供与预期的搜索结果匹配的确切文本。随谈这种技术对于静态文件执行简单搜索和替换任何可能已经足够了，但它缺乏灵活性，若采用这种方法搜索动态文本，几十不是不可能，至少也会变得很困难。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通过是有那个正则表达式，可以：</p>
<ul>
<li>测试字符串内的模式。<br>例如，可以测试输入字符串，以查看字符串内是否出现电话号码模式或信用卡号码模式。这成为数据验证。</li>
<li>替换文本。<br>可以使用正则表达式来识别文档中的特定文本，完全删除该文本或者用其他文本替换它。</li>
<li>基于模式匹配从字符串中提取子字符串。<br>可以查找文档内或输入域内特定的文本。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;例如，可能需要搜索整个网站，删除过时的材料，以及替换某些 HTML 格式标记。在这种情况下，可以正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件裂变缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过世的材料。最后，可以使用正则表达式来搜索和替换标记。</p>
<h2 id="发展历史"><a href="#发展历史" class="headerlink" title="发展历史"></a>发展历史</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经胜利学家研究出一种数学方式来描述这些神经网络。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;1956年，一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上，发表了一篇标题为“神经网时间的表示法”的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式，因此采用“正则表达式”这个术语。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;随后，发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究，Ken Thompson 是 Unix 的主要发明人，正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如他们所说，剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文件的表机器和搜索工具中的一个重要部分。</p>
<h2 id="应用领域"><a href="#应用领域" class="headerlink" title="应用领域"></a>应用领域</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;目前，正则表达式已经在很多软件中得到广泛应用，包括 Linux、Unix、HP等操作系统， PHP、C#、Java等开发环境，以及很多的应用软件中，都可以看到正则表达式的影子</p>
<table>
<thead>
<tr>
<th>命令或环境</th>
<th>.</th>
<th>[]</th>
<th>^</th>
<th>$</th>
<th>\(\)</th>
<th>\{\}</th>
<th>?</th>
<th>+</th>
<th>\</th>
<th></th>
<th>()</th>
</tr>
</thead>
<tbody>
<tr>
<td>vi</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Visual C++</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>awk</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td>awk是支持该语法的， 只是要在命令行加入 –posix or –re-interval参数即可， 可见man awk中的interval expression</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>sed</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>delphi</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>python</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>java</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>javascript</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>php</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>perl</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>C#</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
<td></td>
<td></td>
<td>√</td>
<td>√</td>
<td>√</td>
<td>√</td>
</tr>
</tbody>
</table>

	

	
		<span class="different-posts"><a href="/2017/10/12/正则表达式/1. 正则表达式-简介/" onclick="window.history.go(-1); return false;">⬅️ Go back </a></span>

	

</article>

	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
